
# Create your views here.
from django.contrib.auth import login
from django.shortcuts import render, redirect
from django.views import View
from django import http
from QQLoginTool.QQtool import OAuthQQ
from django.conf import settings

from carts.utils import merge_cart_cookie_to_redis
from meiduo_mall.utils.response_code import RETCODE
from users.models import User
from .models import OauthQQuser
from meiduo_mall.utils import meiduo_signature
from . import contansts
class QQurlView(View):
    def get(self, request):
        # 生成QQ授权地址url
        next_url = request.GET.get('next', '/')
        # 创建工具对象，提供appid、appkey、回调地址
        oauthqq_tool = OAuthQQ(
            settings.QQ_CLIENT_ID,
            settings.QQ_CLIENT_SECRET,
            settings.QQ_REDIRECT_URI,
            next_url
        )
        # 调用方法生成授权地址
        login_url = oauthqq_tool.get_qq_url()
        # 响应
        return http.JsonResponse({
            'code': RETCODE.OK,
            'errmsg': 'OK',
            'login_url': login_url
        })


class QQopenidView(View):
    def get(self, request):
        # 获取授权用户的唯一标识openid
        # 接收code
        code = request.GET.get('code')   #回调地址中返回的code和state
        next_url = request.GET.get('state', '/')#登陆成功后跳转的页面

        # 创建工具对象，提供appid、appkey、回调地址 ，上传参数相当于实参，创建实列调用方法
        oauthqq_tool = OAuthQQ(
            settings.QQ_CLIENT_ID,
            settings.QQ_CLIENT_SECRET,
            settings.QQ_REDIRECT_URI,
            next_url
        )
        try:
            # 根据code获取token
            token = oauthqq_tool.get_access_token(code)

            # 根据token获取openid
            openid = oauthqq_tool.get_open_id(token)

            #绑定
            try:
                qquser = OauthQQuser.objects.get(openid=openid)
            except:
                # 如果没有绑定成功需要将openid加密后通过渲染传给标签，防止通过检查可以查看用户openid，相当于你扣扣的身份证
                token = meiduo_signature.dumps({'openid':openid},contansts.OPID_JIAMI_TIME)
                context ={'token':token}

                return render(request,'oauth_callback.html',context)
            #绑定成功后需要响应，保存会话状态，设置cookie 重定向到主页
            else:
                login(request,qquser.user)

                response =redirect(next_url)
                #登陆成功能后合并购物车
                response = merge_cart_cookie_to_redis(request, response)
                response.set_cookie('username',qquser.user.username,max_age=60*60*24*14)
                return response



        except:
            openid = '0'

        return http.HttpResponse(openid)

    def post(self,request):
        #接受，post 实在get条件下，没有绑定用户的登陆绑定页面，需要在post下判断绑定用户是否存在，前提是他已经注册过，但是没有绑定，
        # 将openid和用户的user 绑定后才能在下次的扣扣扫码中获得权限，直接进入主界面----在用户填写完数据点击表单的时候，post接受数据
        mobile = request.POST.get('mobile')
        pwd = request.POST.get('pwd')
        sms_code_request = request.POST.get('sms_code')
        access_token = request.POST.get('access_token')#绑定后返回的一个绑定的数据
        #在完成渲染后表单发送请求，填写表格，post用于发送数据，先接受数据，再小燕数据，后处理，再响应数据
        next_url = request.GET.get('state')#state 和nextd 意思一样只不过是名字上的叫法不同

        # 验证：与注册逻辑相同，参考注册代码
        # openid
        json = meiduo_signature.loadds(access_token, contansts.OPID_JIAMI_TIME)#解密
        if json is None:#判断解密后的openid，是否失效
            return http.HttpResponseBadRequest('授权信息无效，请重新授权')
        openid = json.get('openid')#取值openid

        #判断用户是否存在，
        try:
            user = User.objects.get(mobile=mobile)
        except:
            #其实这个地方如果用户不存在可以返回到注册页面，也可以在此页面创建关键注册
            user = User.objects.create_user(username =mobile , mobile=mobile,password=pwd)
        else:
            #检查密码是否正确
            if not user.check_password(pwd):
                return http.HttpResponseBadRequest('密码错误')
        #此时用户和密码正确，开始openid 和用户的绑定操作
        OauthQQuser.objects.create(user=user,openid=openid)
        #状态保持
        login(request,user)
        #响应到主页，表示绑定成功
        response  = redirect(next_url)
        # 登陆成功能后合并购物车
        response = merge_cart_cookie_to_redis(request, response)
        response.set_cookie('username',user.username,contansts.OPID_JIAMI_TIME)
        return response
        #表示在get条件下用户没有绑定,刷新在绑定页面下,采用post 的提交方式，在get条件下将openid传到表单的渲染
        #然后通过post请求方式拿到openid，判断此绑定用户是否存在，不确定用户是否已经被注册，没有注册的也可以直接到登陆界面，如果判断没有注册
        # 可以在绑定页面完成注册和绑定的操作，就是说明扣扣登陆和普通注册登陆属于两个互补影响的两个逻辑操作，两个功能相似都可以进入主界面

